
//leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {

    /**
     * 第一遍
     * @param l1
     * @param l2
     * @return
     */
//    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//        // 在两条链表上的指针
//        ListNode p1 = l1, p2 = l2;
//        // 虚拟头节点（构建新链表时常用的技巧）
//        ListNode dummy = new ListNode(-1);
//        ListNode p = dummy;
//
//        // 记录进位
//        int carry = 0;
//        // 这里使用"或"因为，不应定全是3位数+3位数；
//        while (p1 != null || p2 != null || carry > 0) {
//            // 先加上上次的进位(carry: 0 | 1)
//            int val = carry;
//            if (p1 != null) {
//                val += p1.val;
//                p1 = p1.next;
//            }
//            if (p2 != null) {
//                val += p2.val;
//                p2 = p2.next;
//            }
//            // 处理进位情况
//            carry = val / 10;
//            val = val % 10;
//            // 构建新节点，循环一次就构建一次；
//            p.next = new ListNode(val);
//            p = p.next;
//        }
//        return dummy.next;
//    }


    /**
     * 第二遍
     * @param l1
     * @param l2
     * @return
     */
//    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//        // 在两条链表上的指针
//        ListNode p1 = l1, p2 = l2;
//        // 虚拟头节点（构建新链表时常用的技巧）
//        ListNode dummy = new ListNode(-1);
//        ListNode p = dummy;
//
//        // 记录进位
//        int carry = 0;
//        while (p1 != null || p2 != null || carry > 0) {
//            // 如果有进位，先加上进位
//            int val = carry;
//            if (p1 != null) {
//                val += p1.val;
//                p1 = p1.next;
//            }
//            if (p2 != null) {
//                val += p2.val;
//                p2 = p2.next;
//            }
//
//            // 处理进位
//            carry = val / 10;
//            val = val % 10;
//            // 构建新的链表
//            p.next = new ListNode(val);
//            p = p.next;
//        }
//        return dummy.next;
//    }


    /**
     * 第三遍 3/2
     * @param l1
     * @param l2
     * @return
     */
//    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//        // 在两条链表上的指针
//        ListNode p1 = l1, p2 = l2;
//        // 虚拟头节点
//        ListNode dummy = new ListNode(-1);
//        ListNode p = dummy;
//
//        // 记录进位
//        int carry = 0;
//        while (p1 != null || p2 != null || carry > 0) {
//            // 如果有进位
//            int val = carry;
//            if (p1 != null) {
//                val += p1.val;
//                p1 = p1.next;
//            }
//            if (p2 != null) {
//                val += p2.val;
//                p2 = p2.next;
//            }
//
//            // 处理进位
//            carry = val / 10;
//            val = val % 10;
//
//            p.next = new ListNode(val);
//            p = p.next;
//        }
//        return dummy.next;
//    }


    /**
     * 第四遍 3/7
     * @param l1
     * @param l2
     * @return
     */
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 在两条链表上的指针
        ListNode p1 = l1, p2 = l2;
        // 虚拟头节点
        ListNode dummy = new ListNode(-1);
        ListNode p = dummy;

        // 记录进位
        int carry = 0;
        while (p1 != null || p2 != null || carry > 0) {
            int val = carry;
            if (p1 != null) {
                val += p1.val;
                p1 = p1.next;
            }
            if (p2 != null) {
                val += p2.val;
                p2 = p2.next;
            }

            // 处理进位
            carry = val / 10;
            val = val % 10;

            // 构建新的链表
            p.next = new ListNode(val);
            p = p.next;
        }
        return dummy.next;
    }
}
//leetcode submit region end(Prohibit modification and deletion)
